/**
 * extension of JSON, type for jQuery
 * AUTHOR: xushengs@gmail.com
 * LICENSE: http://www.opensource.org/licenses/mit-license.php
 * WEBSITE: http://ooboy.net/
 */
(function($) {
     // the code of this function is from 
     // http://lucassmith.name/pub/typeof.html
     $.type = function(o) {
         var _toS = Object.prototype.toString;
         var _types = {
             'undefined': 'undefined',
             'number': 'number',
             'boolean': 'boolean',
             'string': 'string',
             '[object Function]': 'function',
             '[object RegExp]': 'regexp',
             '[object Array]': 'array',
             '[object Date]': 'date',
             '[object Error]': 'error'
         };
         return _types[typeof o] || _types[_toS.call(o)] || (o ? 'object' : 'null');
     };
     // the code of these two functions is from mootools
     // http://mootools.net
     var $specialChars = { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"': '\\"', '\\': '\\\\' };
     var $replaceChars = function(chr) {
         return $specialChars[chr] || '\\u00' + Math.floor(chr.charCodeAt() / 16).toString(16) + (chr.charCodeAt() % 16).toString(16);
     };
     $.toJSON = function(o) {
         var s = [];
         switch ($.type(o)) {
             case 'undefined':
                 return 'undefined';
                 break;
             case 'null':
                 return 'null';
                 break;
             case 'number':
             case 'boolean':
             case 'date':
             case 'function':
                 return o.toString();
                 break;
             case 'string':
                 return '"' + o.replace(/[\x00-\x1f\\"]/g, $replaceChars) + '"';
                 break;
             case 'array':
                 for (var i = 0, l = o.length; i < l; i++) {
                     s.push($.toJSON(o[i]));
                 }
                 return '[' + s.join(',') + ']';
                 break;
             case 'error':
             case 'object':
                 for (var p in o) {
                     s.push(p + ':' + $.toJSON(o[p]));
                 }
                 return '{' + s.join(',') + '}';
                 break;
             default:
                 return '';
                 break;
         }
     };
     $.evalJSON = function(s) {
         if ($.type(s) != 'string' || !s.length) return null;
         return eval('(' + s + ')');
     };
})(jQuery);